﻿#pragma once
#include "Constant.h"
#include <cmath>
#include <iostream>
#include <iomanip>

using namespace std;

// 坐标结构体
struct XYZ { double x, y, z; };
struct BLH { double B, L, H; };  // B:纬度(°), L:经度(°), H:高程(m)
struct ENU { double e, n, u; };  // e:东方向, n:北方向, u:天顶方向

// 坐标系统基类
class CoordSys {
public:
    CoordSys();
    explicit CoordSys(const RefEllip& ellip);

    // 坐标转换函数
    XYZ BLH2XYZ(const BLH& blh) const;
    BLH XYZ2BLH(const XYZ& xyz) const;
    ENU XYZ2ENU(const XYZ& origin, const XYZ& point) const;

    // 坐标运算函数
    XYZ subtract(const XYZ& a, const XYZ& b) const;
    double mod(const XYZ& xyz) const;
public:
    void test();/* 用于测试这个类，在控制台显示结果 */

protected:
    RefEllip ellip;     // 参考椭球参数
    double e2;          // 第一偏心率平方
};

// BDCS坐标系派生类
class BDCS : public CoordSys {
public:
    BDCS();
    BDCS(RefEllip ellip);
};

// WGS84坐标系派生类
class WGS84 : public CoordSys {
public:
    WGS84();
    WGS84(RefEllip ellip);

};

// 度转弧度常量 (在头文件中声明为extern)
extern const double D2R;